package com.holly.common.utils;

import android.util.Log;

/**
 * 日志打印工具类
 * 2016/11/03 <br/>
 *
 * @author Joey Huang QQ:273179370）
 */
public class L {
    //默认的TAG，建议后面加下划线
    private static final String DEFAULT_TAG = "holly_";

    //日志等级（不想打印日志，可设置为 log.ASSERT）
    public static int LOG_LEVEL = Log.VERBOSE;

    //防止实例
    private L() {
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    //生成TAG
    public static String createTag(Object o) {
        return o == null ? DEFAULT_TAG : DEFAULT_TAG + o.getClass().getSimpleName();
    }

    public static void v(String msg) {
        if (Log.VERBOSE >= LOG_LEVEL)
            Log.v(DEFAULT_TAG, msg);
    }

    public static void d(String msg) {
        if (Log.DEBUG >= LOG_LEVEL && msg != null)
            Log.d(DEFAULT_TAG, msg);
    }

    public static void i(String msg) {
        if (Log.INFO >= LOG_LEVEL && msg != null)
            Log.i(DEFAULT_TAG, msg);
    }

    public static void w(String msg) {
        if (Log.WARN >= LOG_LEVEL && msg != null)
            Log.w(DEFAULT_TAG, msg);
    }

    public static void e(String msg) {
        if (Log.ERROR >= LOG_LEVEL && msg != null) {
            e(DEFAULT_TAG, msg);
        }
    }

    public static void v(String tag, String msg) {
        if (Log.VERBOSE >= LOG_LEVEL && msg != null)
            Log.v(tag, msg);
    }

    public static void d(String tag, String msg) {
        if (Log.DEBUG >= LOG_LEVEL && msg != null)
            Log.d(tag, msg);
    }

    public static void d(String tag, String msg,boolean isBig) {
        if (Log.DEBUG >= LOG_LEVEL && msg != null) {
            if (isBig) {
                while (msg.length() > 0) {
                    String s;
                    if (msg.length() > 1000) {
                        Log.d(tag, msg.substring(0, 1000));
                        msg= msg.substring(1000,msg.length());
                    } else {
                        Log.d(tag, msg);
                        msg="";
                    }
                }
            } else {
                Log.d(tag, msg);
            }
        }
    }

    public static void i(String tag, String msg) {
        if (Log.INFO >= LOG_LEVEL && msg != null)
            Log.i(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (Log.WARN >= LOG_LEVEL && msg != null)
            Log.w(tag, msg);
    }

    public static void e(String tag, String msg) {
        e(tag,msg,null);
    }

    public static void e(String tag, Throwable ex) {
        e(tag,null,ex);
    }

    public static void e(Throwable ex) {
        e(null,null,ex);
    }

    public static void e(String tag, String msg,Throwable ex) {
        if (msg == null && ex == null) {
            return;
        }
        if (tag == null) {
            tag = DEFAULT_TAG+"null";
        }
        if (Log.ERROR >= LOG_LEVEL) {
            StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
            Log.e(tag, "(" + targetStackTraceElement.getFileName() + ":" + targetStackTraceElement.getLineNumber() + ")");
            String resultMsg = "";
            if (msg != null) {
                resultMsg +=msg+"\n";
            }
            if (ex != null) {
                resultMsg +=Log.getStackTraceString(ex);
            }
            Log.e(tag, resultMsg);
        }
    }

    //用于打印可以忽略的信息，比如说被忽视的catch
    public static void ignore(String tag, String msg) {
        if (Log.VERBOSE >= LOG_LEVEL && msg != null)
            Log.v(tag, "ignore_" + msg);
    }

    //来自鸿洋大神的手笔
    private static StackTraceElement getTargetStackTraceElement() {
        // find the target invoked method
        StackTraceElement targetStackTrace = null;
        boolean shouldTrace = false;
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        for (StackTraceElement stackTraceElement : stackTrace) {
            boolean isLogMethod = stackTraceElement.getClassName().equals(L.class.getName()) || stackTraceElement.getClassName().startsWith("java.lang");
            if (shouldTrace && !isLogMethod) {
                targetStackTrace = stackTraceElement;
                break;
            }
            shouldTrace = isLogMethod;
        }
        return targetStackTrace;
    }
}